package ru.susu.algebra.chartable.degree;

import java.math.BigInteger;

import ru.susu.algebra.partition.Partition;
import ru.susu.algebra.util.NumberUtilities;

/**
 * @author akargapolov
 * @since: 06.09.2009
 */
public class HooksDegreeCalculator implements IDegreeCalculator
{
	/**
	 * Вычисляет степень характера на основе формулы deg = n! / h_ij, где h_ij - длина крюка с вершиной в (i,j)
	 */
	@Override
	public BigInteger calculateDegree(Partition partition)
	{
		BigInteger result = NumberUtilities.getFactorial(partition.getPresentedNumber());

		Integer array[] = partition.getArrayRepresentation();
		for (int i = 0; i < array.length; i++) //идем по каждому элементу разбиения
			for (int j = 1; j <= array[i]; j++) //идем по каждой клетке элемента
			{
				int k;
				for (k = 0; i - k >= 0 && array[i - k] >= j; k++)	//вычисляем длину ноги крюка - колво элементов внизу с длиной >= j
					;
				result = result.divide(BigInteger.valueOf(array[i] - j + k));	//рука array[i] - j -1 плюс 1 плюс k - нога
			}
		return result;
	}

}
